package com.youlv.yl.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.youlv.yl.dao.HotelOrderItemDao;
import com.youlv.yl.dao.HotelOrderLogDao;
import com.youlv.yl.dao.HotelCartItemDao;
import com.youlv.yl.dto.HotelOrderCartDto;
import com.youlv.yl.dto.HotelOrderGoodsDto;
import com.youlv.yl.entity.hotel.HotelOrder;
import com.youlv.yl.dao.HotelOrderDao;
import com.youlv.yl.entity.hotel.HotelOrderItem;
import com.youlv.yl.entity.hotel.HotelOrderLog;
import com.youlv.yl.service.intf.HotelOrderService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.youlv.yl.util.SnowFlakeUtils;
import com.youlv.yl.util.StringUtils;
import com.youlv.yl.util.TokenUtils;
import com.youlv.yl.vo.R;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * <p>
 * 订单表  服务实现类
 * </p>
 *
 * @author fenghe
 * @since 2022-01-25
 */
@Service
public class HotelOrderServiceImpl extends ServiceImpl<HotelOrderDao, HotelOrder> implements HotelOrderService {

    @Autowired
    private HotelOrderDao dao;
    @Autowired
    private HotelOrderItemDao itemDao;
    @Autowired
    private HotelOrderLogDao logDao;
    @Autowired
    private HotelCartItemDao cartItemDao;


    @Override
    public R save(HotelOrderCartDto dto) {
        // 1.入参验证
        if(dto != null && dto.getToken().length() > 0 && dto.getDtoList() != null) {
            // 通过token获取用户id
            Long uid = TokenUtils.getUidByToken(dto.getToken());
            // 2.验证库存
            // 2.创建订单对象
            HotelOrder order = new HotelOrder(SnowFlakeUtils.getInstance().nextId() + "",
                    dto.getTmoney(), dto.getFmoney(),
                    dto.getTmoney() - dto.getFmoney(),
                    uid, dto.getInfo(), dto.getName(), dto.getPhone());
            // 4.新增数据
            dao.insert(order);
            // 5.新增订单详情--可以Mybatis的批处理
            dto.getDtoList().forEach((o)->{
                HotelOrderItem item = new HotelOrderItem(order.getId(), o.getHotelName(), o.getHouseType(), o.getNum(), o.getJoinPrice());
                itemDao.insert(item);

                // 6.扣减库存

            });
            // 7.回清购物车.
            cartItemDao.delBatch(dto.getCiids());
            // 8.记录流水
            logDao.insert(new HotelOrderLog(order.getId(), 1, "选择购物车，创建了订单"));
            // 9.返回结果
            return R.ok(order);
        }
        return R.fail("请检查参数信息");
    }

    @Override
    public R save(HotelOrderGoodsDto dto) {
        // 1.验证
        if(dto != null && dto.getItem() != null) {
            // 通过token获取用户id
            Long uid = TokenUtils.getUidByToken(dto.getToken());
            // 2.验证库存 略
            // 2.创建订单对象
            HotelOrder order = new HotelOrder(SnowFlakeUtils.getInstance().nextId() + "",
                    dto.getTmoney(), dto.getFmoney(),
                    dto.getTmoney() - dto.getFmoney(),
                    uid, dto.getInfo(), dto.getName(), dto.getPhone());
            // 4.新增数据
            dao.insert(order);
            // 5.新增订单详情--可以Mybatis的批处理
            HotelOrderItem item = new HotelOrderItem(order.getId(), dto.getItem().getHotelName(), dto.getItem().getHouseType(), dto.getItem().getNum(), dto.getItem().getJoinPrice());
            itemDao.insert(item);
            // 6.扣减库存
            // 7.记录流水
            logDao.insert(new HotelOrderLog(order.getId(), 1, "商品详情，立即购买，创建了订单"));
            // 8.返回结果
            return R.ok(order);
        }
        return R.fail("请检查参数信息");
    }

    @Override
    public R queryMy(String token, Integer type) {
        // 1.检验
        if(StringUtils.isNotEmpty(token)) {
            // 通过token获取用户id
            Long uid = TokenUtils.getUidByToken(token);
            // 2.构建查询条件对象
            if(type == 4) {
                QueryWrapper<HotelOrder> queryWrapper = new QueryWrapper<>();
                queryWrapper.eq("uid", uid);
                queryWrapper.orderByDesc("ctime");
                return R.ok(dao.selectList(queryWrapper));
            }
            QueryWrapper<HotelOrder> queryWrapper = new QueryWrapper<>();
            queryWrapper.eq("uid", uid).eq("flag", type);
            // 3.验证查询的订单状态
            if(type == 3) {
                type = 4;
                queryWrapper.eq("flag", type);
            }
            queryWrapper.orderByDesc("ctime");

            // 3.返回结果
            return R.ok(dao.selectList(queryWrapper));
        }
        return R.fail("请检查参数信息！");
    }

    @Override
    public R queryDetail(Long oid) {
        return null;
    }

    @Override
    public R change(Long oid, Integer flag) {
        return null;
    }

    /** 订单取消*/
    @Override
    public R cancel(Long oid) {
        // 1.验证
        if(oid > 0) {
            // 2.修改了订单状态
            if(dao.updateFlag(oid, 8) > 0) {
                // 3.查询订单详情
//                QueryWrapper<HotelOrderItem> queryWrapper = new QueryWrapper<>();
//                queryWrapper.eq("oid", oid);
//                List<HotelOrderItem> list = dao.selectList(queryWrapper);
                // 4.释放库存，再把商品库存加回去
//                list.forEach(o -> {
//                    goodsDao.updateStock(o.getGid(), -o.getNum());
//                });
                // 5.记录日志
                logDao.insert(new HotelOrderLog(oid, 8, "取消了订单，释放资源！"));
                // 6.返回
                return R.ok();
            }
        }
        return R.fail("请检查参数信息");
    }
}
